package fi.uba.algocontrol.model.aviones;

import fi.uba.algocontrol.model.Mapa;
import fi.uba.algocontrol.model.Vector;
import fi.uba.algocontrol.model.niveles.Nivel;
import fi.uba.algocontrol.model.niveles.NivelManager;

import java.util.Random;

public class AvionFactory
{
    private static AvionFactory INSTANCE = null;

    private AvionFactory()
    {

    }

    public static AvionFactory getInstance()
    {
        if (INSTANCE == null)
            INSTANCE = new AvionFactory();

        return INSTANCE;
    }

    private Vector generarPosicionInicial()
    {
        Random generadorRandom = new Random();
        Vector posicion;

        if(generadorRandom.nextBoolean())
        {
            //el avion se crea en lateral superior o inferior
            if(generadorRandom.nextBoolean())
                posicion = new Vector( generadorRandom.nextInt(Mapa.getAncho()), 10 ); //superior
            else
                posicion = new Vector( generadorRandom.nextInt(Mapa.getAncho()), Mapa.getAlto() - 10 );//inferior
        }
        else
        {
            //el avion se crea en lateral derecho o izquierdo
            if(generadorRandom.nextBoolean())
                posicion = new Vector( 10, generadorRandom.nextInt(Mapa.getAlto()) ); //derecho
            else
                posicion = new Vector( Mapa.getAncho() - 10, generadorRandom.nextInt(Mapa.getAlto()) ); //izquierdo
        }


        return posicion;
    }

    private Vector generarDireccionInicial(Vector posicionInicial)
    {
        int xCentro = Mapa.getAncho()/2;
        int yCentro = Mapa.getAlto()/2;
        Vector centro = new Vector(xCentro,yCentro);
        Vector direccionInicial = centro.substract(posicionInicial).getNormalizado();
        return direccionInicial;

    }

    public AvionSimple crearAvionSimple()
    {
        Nivel nivel = NivelManager.getInstance().getNivelActual();
        Vector posicion = this.generarPosicionInicial();
        Vector direccion = this.generarDireccionInicial( posicion );
        Integer velocidad = nivel.getDificultad().getVelocidadAviones();

        return new AvionSimple(posicion, velocidad, direccion);
    }

    public AvionComputarizado crearAvionComputarizado()
    {
        Nivel nivel = NivelManager.getInstance().getNivelActual();
        Vector posicion = this.generarPosicionInicial();
        Vector direccion = this.generarDireccionInicial(posicion);
        Integer velocidad = nivel.getDificultad().getVelocidadAviones();

        return new AvionComputarizado(posicion, velocidad, direccion);
    }

    public AvionHelicoptero crearAvionHelicoptero()
    {
        Nivel nivel = NivelManager.getInstance().getNivelActual();
        Vector posicion = this.generarPosicionInicial();
        Vector direccion = this.generarDireccionInicial(posicion);
        Integer velocidad = nivel.getDificultad().getVelocidadAviones();

        return new AvionHelicoptero(posicion, velocidad, direccion);
    }

    public AvionPesado crearAvionPesado()
    {
        Nivel nivel = NivelManager.getInstance().getNivelActual();
        Vector posicion = this.generarPosicionInicial();
        Vector direccion = this.generarDireccionInicial(posicion);
        Integer velocidad = nivel.getDificultad().getVelocidadAviones();

        return new AvionPesado(posicion, velocidad, direccion);
    }





}
